#ifndef PLAYERDEFINE_H
#define PLAYERDEFINE_H

#include <QObject>
#include "ffinclude.h"

//媒体资源信息
struct MediaInfo
{
    MediaInfo(){init();}
    void init();

    //媒体播表信息
    QString id;                //媒体源id
    QString url;               //媒体源地址
    QString programType;       //节目类型：plan(播表)、spot（插播）、shim（垫片）、custom（定制）
    QString programName;       //节目单名称（上传播放日志用）
    QString programId;         //节目单ID（上传播放日志用）
    qint64 startPos;           //指定媒体正放/倒放时的起始播放位置(ms)，反向播放时此值必须大于0
    qint64 endPos;             //指定媒体需要播放多久后停止(ms)，如果endPos超过duration，则会循环播放

    //媒体元数据
    bool isQueryed;             //媒体是否已经查询过元信息
    bool isValid;               //媒体地址是否有效
    QString mediaType;          //媒体类型（video/audio/live/image）
    QString containerFormat;    //封装格式
    QString videoFormat;        //视频流格式
    QString audioFormat;        //音频流格式
    qint64 duration;            //码流总时长（ms）
    int videoFrameWidth;        //视频帧宽度
    int videoFrameHeight;       //视频帧高度
    int videoFramerate;         //视频流帧率
    int videoBitrate;           //视频流码率
    int audioSamplerate;        //音频流采样率
    int audioChannels;          //音频流声道数
    int audioBitrate;           //音频流码率
    qint64 fileSize;            //文件大小（字节）


    //媒体状态数据
    int errorCount;     //媒体连续播放失败次数
    bool isSeeked;      //媒体是否已经定位过
    qint64 reminTime;   //媒体暂停后剩余播放时长
};

//播放器配置
struct PlayerConfig{
    //拉流
    double speed;           //播放倍速
    qint64 startPos;        //起始播放位置（ms）
    int timeout;            //拉流超时时间（ms）
    bool rtspWithTcp;       //RTSP拉流时是否使用TCP传输
    bool videoEnable;       //是否播放视频流
    bool audioEnable;       //是否播放音频流
    bool textEnable;        //是否播放字幕流
    bool loop;              //是否循环播放文件
    qint64 maxProbeSize;    //码流分析最大读取数据量（kb）

    //解码
    QString vcodecName;     //视频解码器
    QString acodecName;     //音频解码器
    int lowers;             //降分辨等级（值越大降分辨率程度越高，但会损失图像质量）
    bool fastMode;          //是否启用快速解码（启用能够加快解码，但会损失图像质量）
    int codecThreads;       //解码器线程数（默认自动选择）
    bool reorderPts;        //是否需要让解码器重新排布pts
    bool framedrop;         //是否丢包

    //渲染
    AV_SYNC_TYPE avType;    //音视频同步方式（0/音频（默认），1/视频，其他/外部时钟）
    const void* winId;      //视频渲染窗口
    QRect renderRect;       //视频渲染区域（默认与窗口大小一致）
    bool hwRender;          //启用硬件加速渲染
    int volume;             //输出音量百分比
    int muted;              //是否静音
    bool fill;              //是否按填充模式渲染视频
    bool keepLastFrame;     //播放结束时是否保持显示最后一帧
    bool hideCursor;        //当鼠标位于渲染窗口上是否隐藏
};

//播放器信息
struct PlayerInfo {
    //共享数据
    bool isLiveStream;          //是否为直播流
    double maxFrameDuration;    //单帧最大允许时长，超过此值将会在解码时丢弃
    bool demuxEof;              //解复用是否解完最后一包
    bool videoCodecEof;         //视频解码是否已解完最后一帧
    bool audioCodecEof;         //音频解码是否已解完最后一帧
    bool textCodecEof;          //字幕解码是否已解完最后一帧
    int videoFrameDropsOnDecode; //解码时视频同步丢包数量
    int videoFrameDropsOnRender; //渲染时视频同步丢包数量
    AV_SYNC_TYPE syncType;      //当前生效的音视频同步方式
    int readPauseReturn;        //解复用暂停的返回值

    //demux
    AVFormatContext* formatContext;
    AVStream* videoStream;
    AVStream* audioStream;
    AVStream* textStream;

    //decode
    AVCodecContext* videoCodecContext;
    AVCodec* videoCodec;
    AVCodecContext* audioCodecContext;
    AVCodec* audioCodec;
    AVCodecContext* textCodecContext;
    AVCodec* textCodec;

    //queue
    AVPacket flushPkt;
    FrameQueue videoFrameQueue;
    FrameQueue textFrameQueue;
    FrameQueue audioFrameQueue;
    PacketQueue textPacketQueue;
    PacketQueue videoPacketQueue;
    PacketQueue audioPacketQueue;

    //clock
    Clock*masterClock;
    Clock audioClock;
    Clock videoClock;
    Clock externalClock;

    SDL_cond *continue_read_thread;
};

#endif // PLAYERDEFINE_H
